Container
的硬碟空間是短暫的,隨著 Container
生命一同消失,那麼重要的資料該如何保存? 今天會說明 Volumes
與 Storage Class
是什麼,以及該如何使用
Volumes
?kubernetes
中的 Volumes
跟 Docker
的 Volumes
是相同的,都是為了解決檔案在 Container
中無法永續存活問題,在 Kubernetes
中 Valume
具有多種類型,以下挑幾個本機練習可使用到的進行講解:
注意: 容器異常時並不會導致 Pod
服務被移除,故 emptyDir
的數據是安全的,需等到 Pod
完全被移除才會一併刪除 emptyDir
資料。
## pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
Container
內,且當服務因某些原因重新啟動,或者需要重新建置,檔案仍保存在 Node
上,直到該文件被移除或者該 Node
被移除 Kubernetes Cluster
。## pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
# this field is optional
type: Directory
StorageClass
?如果要說明什麼是 StorageClass
,應該一併說明 PersistentVolume
與 PersistentVolumeClaim
當用戶在建立 Pod
服務使用到 PVC(PersistentVolumeClaim)
,這時會自動找一個符合的 PV(PersistentVolume)
進行批配,若有批配到就直接逕行綁定(此時表示與PV
進行「靜態」批配),但是如果沒有符合的 PV
,則會透過StorageClass
建立一個新的PV
再和PVC
綁定(此時表示與PV
進行「動態」批配)。
PersistentVolume
概念也是跟 Volume
差不多,用意都是在協助保存資料,將資料永久化,只是開發人員不需要再為了檔案要保留在哪個空間而感到困擾,試著想像一下如果有1個Nginx服務,我們需要將 nginx.conf
掛載,偏偏 kubernetes
又會協助將服務建置在 Loading
輕的 Node
上,為了讓服務能正常啟動,每台 Node
上都需要掛載 nginx.conf
,又或者當服務越來越多時,掛載數量也會越來越多...相對的就比較不容易管理,這時當然就是推薦使用 PersistentVolume
啦,請看看下方圖片:
(圖片取自網路)
系統管理人員負責建置 PV
,而開發人員則是負責建立 PVC
與 Storage Class
,並交由 PVC
自動尋找合適的 PV
進行綁定,或者透過StorageClass
建立一個新的PV
再和PVC
綁定
那麼 PersistentVolume
數量這麼多,該如何找到適合的呢? 這時候當然是要由系統管理人員對 PersistentVolume
進行分類,也就是說在建立 PersistentVolume
同時必須賦予有意義的 Label
或者 storgeClassName
做為識別證,另外也需要規範回收策略,例如:
Storage Class
時,一併移除資料(default)Storage Class
時,資料會保留等待手動刪除PersistentVolume
?PersistentVolume
是存放資源的地方,簡單想像的話就是個 Disk
空間, PersistentVolume
分為兩種:
PersistentVolume
稱為「靜態」綁定PVC
在批配 PV
時,若不符合規則會透過 StorageClass
自動建立新的PV
,此時PV
我們會稱為「動態」綁定,並且繼承 StorageClass
規定的回收政策。PV
建立時,可以設定以下內容:
相對的 StorageClass
也可以加入此兩項設定,當 PVC
無法批配符合的 PV
時,才可以透過 StorageClass
協助動態建置 PV
PersistentVolumeClaim
?PVC(PersistentVolumeClaim)```` 負責批配符合條件的
PV,並與該
PV``` 進行綁定。
PVC
提供三種與PV
中的檔案存取模式:
PVC
該如何與 PV
進行綁定:
storageClassName
名稱,找到相同 PV
。Label
標籤,找到相同 PV
。範例:(下方案例為手動建置 PV
)
StorageClass
、PVC
、PV
## storageclass.yaml
apiVersion: storage.k8s.io/v1 ## API 版本
kind: StorageClass ## 元件種類
metadata:
name: ssd ## storage class 名稱
provisioner: kubernetes.io/gce-pd ## 指定 Volumn 類型
parameters: ## PV 符合條件
type: pd-ssd
reclaimPolicy: Retain ## 回收機制
## pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: ssd
hostPath:
path: /tmp
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-master-storage
spec:
storageClassName: ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi